/*
 * Cpf.java
 *
 * Created on 25 de Agosto de 2007, 10:26
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package br.com.sgpa.utilidade;


import java.util.*;

public class Cpf {
    private static int     d1, d2;
    private static int     digito1, digito2, resto;
    private static int     digitoCpf;
    private static String  numeroDigitoResultado;
      
    public static boolean isValido(String cpf ) {
        
        if (cpf==null) return false;    
        cpf = (cpf.replace(".","")).replace("-","");
                
        try {
            java.lang.Long lng = java.lang.Long.parseLong(cpf);
        } catch (Exception ex) {
            return false;
        }
        cpf = tratarCpf(cpf);
        if (cpf.length()!=11) return false;       
        String digitoVerificador = calcularValidadeCpf(cpf);
        
        return digitoVerificador.equals(getNumeroDigitoResultado());
    }
    private static String calcularValidadeCpf(final String cpf) throws NumberFormatException {
        
        
        atribuirValoresIniciais();
        calcularDigitos(cpf);
        setDigito1(restoDigitoUm(getD1()));
        setDigito2(restoDigitoDois(getDigito1(), getD2()));
        String digitoVerificador = cpf.substring(cpf.length()-2, cpf.length());
        setNumeroDigitoResultado(String.valueOf(getDigito1())  + String.valueOf(getDigito2()));
        return digitoVerificador;
    }
    private static void atribuirValoresIniciais() {
        setD1(0);
        setD2(0);
        setDigito1(0);
        setResto(0);
        setDigito2(0);
    }
    private static void calcularDigitos(final String Cpf) throws NumberFormatException {
        
        for (int nCount = 1; nCount < Cpf.length() -1; nCount++) {
            setDigitoCpf(Integer.valueOf(Cpf.substring(nCount -1, nCount)).intValue());
            setD1(getD1() + ( 11 - nCount ) * getDigitoCpf());
            setD2(getD2() + ( 12 - nCount ) * getDigitoCpf());
        };
    }
    private static int restoDigitoDois(final int digito1, int d2) {
        int resto;
        int digito2;
        
        d2 += 2 * digito1;
        
        
        resto = (d2 % 11);
        
        
        if (resto < 2)
            digito2 = 0;
        else
            digito2 = 11 - resto;
        return digito2;
    }
    private static int restoDigitoUm(final int d1) {
        int resto;
        int digito1;
        
        
        resto = (d1 % 11);
        
        
        if (resto < 2)
            digito1 = 0;
        else
            digito1 = 11 - resto;
        return digito1;
    }
    private static int getD1() {
        return d1;
    }
    private static void setD1(int aD1) {
        d1 = aD1;
    }
    private static int getD2() {
        return d2;
    }
    private static void setD2(int aD2) {
        d2 = aD2;
    }
    private static int getDigito1() {
        return digito1;
    }
    private static void setDigito1(int aDigito1) {
        digito1 = aDigito1;
    }
    private static int getDigito2() {
        return digito2;
    }
    private static void setDigito2(int aDigito2) {
        digito2 = aDigito2;
    }
    private static int getResto() {
        return resto;
    }
    private static void setResto(int aResto) {
        resto = aResto;
    }
    private static int getDigitoCpf() {
        return digitoCpf;
    }
    private static void setDigitoCpf(int aDigitoCpf) {
        digitoCpf = aDigitoCpf;
    }
    private static String getNumeroDigitoResultado() {
        return numeroDigitoResultado;
    }
    private static void setNumeroDigitoResultado(String aNumeroDigitoResultado) {
        numeroDigitoResultado = aNumeroDigitoResultado;
    }
    private static String tratarCpf(String Cpf) {
        String cpf;
        
        
        if (Cpf.length()<11) {
            int tamanho = Cpf.length();
            
            for (int i = 0; i < 11-tamanho; i++) {
                Cpf = "0" + Cpf ;
            }
            
        }
        
        return Cpf;
    }
 
    
}
